/**
 * 检查给定值是否为空或无效
 *
 * 此函数旨在处理各种类型的值，包括基本类型和复杂对象，以确定它们是否应被视为“空”或无效
 * 对于不同的数据类型，使用不同的判断标准来决定值是否为空
 *
 * @param val 任意类型的值，用于检查其是否为空或无效
 * @returns 返回布尔值，如果值为空或无效，则返回true；否则返回false
 */
function isEmpty(val: any) {
  // null or undefined
  if (val == null) return true
  if (typeof val === 'boolean') return false

  if (typeof val === 'number') return !val

  if (val instanceof Error) return val.message === ''

  switch (Object.prototype.toString.call(val)) {
    // String or Array
    case '[object String]':
    case '[object Array]':
      return !val.length

    // Map or Set or File
    case '[object File]':
    case '[object Map]':
    case '[object Set]': {
      return !val.size
    }

    // Plain Object
    case '[object Object]': {
      return !Object.keys(val).length
    }
  }

  return false
}

export default isEmpty
